From: kaf24@firebug.cl.cam.ac.uk Date: Fri, 14 Apr 2006 10:58:11 +0000 (+0100) Subject: Must use __copy_to_user_inatomic() in swiotlb's sync_single() X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16158^2~2^2~22 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=e90ce31de38fc76af4375c498d1437ed841c140e;p=xen.git Must use __copy_to_user_inatomic() in swiotlb's sync_single() function, as we cannot sleep there. Signed-off-by: Keir Fraser --- diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c b/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c index da0a0981ca..913114acba 100644 --- a/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c +++ b/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c @@ -206,8 +206,8 @@ swiotlb_init(void) } /* - * We use __copy_to_user to transfer to the host buffer because the buffer - * may be mapped read-only (e.g, in blkback driver) but lower-level + * We use __copy_to_user_inatomic to transfer to the host buffer because the + * buffer may be mapped read-only (e.g, in blkback driver) but lower-level * drivers map the buffer for DMA_BIDIRECTIONAL access. This causes an * unnecessary copy from the aperture to the host buffer, and a page fault. */ @@ -225,7 +225,7 @@ __sync_single(struct phys_addr buffer, char *dma_addr, size_t size, int dir) dev = dma_addr + size - len; host = kmp + buffer.offset; if (dir == DMA_FROM_DEVICE) { - if (__copy_to_user(host, dev, bytes)) + if (__copy_to_user_inatomic(host, dev, bytes)) /* inaccessible */; } else memcpy(dev, host, bytes); @@ -238,7 +238,7 @@ __sync_single(struct phys_addr buffer, char *dma_addr, size_t size, int dir) char *host = (char *)phys_to_virt( page_to_pseudophys(buffer.page)) + buffer.offset; if (dir == DMA_FROM_DEVICE) { - if (__copy_to_user(host, dma_addr, size)) + if (__copy_to_user_inatomic(host, dma_addr, size)) /* inaccessible */; } else if (dir == DMA_TO_DEVICE) memcpy(dma_addr, host, size);